package com.charon.auth.common.handler;

import com.charon.auth.common.abstraction.AbstractImageCodeProperties;
import com.charon.auth.common.entity.ImageCode;
import com.charon.common.util.ImageCodeUtils;
import com.charon.common.util.RandomUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.ServletRequestUtils;
import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage;

/**
  *@ClassName: ImageCodeHandler
  *@Description: 生成图片验证码
  *@Author: Charon [248135724@qq.com]
  *@Date: 2019/1/29 0029 10:55
  *@Version: 1.0
  */
@Slf4j
public class ImageCodeHandler {

    /**
     * 默认验证码长度
     */
    public final static int DEFAULT_LENGTH=4;
    /**
     * 默认过期时间
     */
    public final static int DEFAULT_EXPIRE=120;

    /**
     * Description: 生成验证码图片对象
     * <p>Author: Charon [248135724@qq.com]
     * @Date 2019/1/31 19:50
     * @return com.charon.common.base.ImageCode
     */
    public static ImageCode createImageCode(){
        return createImageCode(ImageCodeUtils.DEFAULT_WIDTH,ImageCodeUtils.DEFAULT_HEIGHT);
    }

    /**
     * Description: 生成验证码图片对象
     * <p>Author: Charon [248135724@qq.com]
     * @Date 2019/1/31 19:53
     * @param width 验证码图片宽度
     * @param height 验证码图片高度
     * @return com.charon.common.base.ImageCode
     */
    public static ImageCode createImageCode(Integer width,Integer height){
        return createImageCode(width,height,DEFAULT_LENGTH);
    }

    /**
     * Description: 生成验证码图片对象
     * <p>Author: Charon [248135724@qq.com]
     * @Date 2019/2/1 12:39
     * @param request （null时将使用默认配置）
     * @return com.charon.common.entity.ImageCode
     */
    public static ImageCode createImageCode(HttpServletRequest request){
        int width=ImageCodeUtils.DEFAULT_WIDTH;
        int height=ImageCodeUtils.DEFAULT_HEIGHT;
        if(request!=null){
            width=ServletRequestUtils.getIntParameter(request,"width",ImageCodeUtils.DEFAULT_WIDTH);
            height=ServletRequestUtils.getIntParameter(request,"height",ImageCodeUtils.DEFAULT_HEIGHT);
        }else{
            log.warn("警告：request对象为空，生成图形验证码将使用默认值。");
        }

        return createImageCode(width,height);
    }

    /**
     * Description: 生成验证码图片
     * <p>Author: Charon [248135724@qq.com]
     * @Date 2019/1/31 21:25
     * @param imageCodeProperties 验证码图片配置
     * @return com.charon.common.entity.ImageCode
     */
    public static ImageCode createImageCode(AbstractImageCodeProperties imageCodeProperties){
        return createImageCode(null,imageCodeProperties);
    }

    /**
     * Description: 生成验证码图片对象
     * <p>Author: Charon [248135724@qq.com]
     * @Date 2019/2/1 12:16
     * @param request 从request获取验证码的配置参数
     * @param imageCodeProperties 验证码图片配置
     * @return com.charon.common.entity.ImageCode
     */
    public static ImageCode createImageCode(HttpServletRequest request, AbstractImageCodeProperties imageCodeProperties){
        //初始化默认配置
        int confWidth=ImageCodeUtils.DEFAULT_WIDTH;
        int confHeight=ImageCodeUtils.DEFAULT_HEIGHT;
        int confLength=DEFAULT_LENGTH;
        int confExpire=DEFAULT_EXPIRE;
        if(request!=null&&imageCodeProperties!=null){//请求和配置均不为空，优先使用请求。
            confWidth=ServletRequestUtils.getIntParameter(request,"width",imageCodeProperties.getWidth());
            log.info("验证码：加载request中的参数，width:"+confWidth);
            confHeight=ServletRequestUtils.getIntParameter(request,"height",imageCodeProperties.getHeight());
            confLength=ServletRequestUtils.getIntParameter(request,"length",imageCodeProperties.getLength());
            confExpire=ServletRequestUtils.getIntParameter(request,"expire",imageCodeProperties.getExpire());
        }
        else if(request==null&&imageCodeProperties!=null){//请求为空，配置不为空。
            log.warn("警告：request对象为空，生成图形验证码将使用默认值。");
            confWidth=imageCodeProperties.getWidth();
            confHeight=imageCodeProperties.getHeight();
            confLength=imageCodeProperties.getLength();
            confExpire=imageCodeProperties.getExpire();
        }else if(request!=null&&imageCodeProperties==null){//请求不为空，配置为空。
            confWidth=ServletRequestUtils.getIntParameter(request,"width",ImageCodeUtils.DEFAULT_WIDTH);
            confHeight=ServletRequestUtils.getIntParameter(request,"height",ImageCodeUtils.DEFAULT_HEIGHT);
            confLength=ServletRequestUtils.getIntParameter(request,"length",DEFAULT_LENGTH);
            confExpire=ServletRequestUtils.getIntParameter(request,"expire",DEFAULT_EXPIRE);
        }else{//请求和配置均为空。
            log.warn("警告：request对象为空，生成图形验证码将使用默认值。");
        }
        return createImageCode(confWidth,confHeight,confLength,confExpire);
    }


    /**
     * @Description 生成验证码图片对象
     * @Author Charon [248135724@qq.com]
     * @Date 2019/1/31 19:42
     * @param width 验证码图片宽度
     * @param height 验证码图片高度
     * @param length 验证码长度（位数）
     * @return com.charon.common.base.ImageCode
     */
    public static ImageCode createImageCode(Integer width,Integer height,Integer length){
        return createImageCode(width,height,length,DEFAULT_EXPIRE);

    }

    /**
     * Description: 生成验证码图片对象
     * <p>Author: Charon [248135724@qq.com]
     * @Date 2019/2/7 3:24
     * @param width 验证码图片宽度
     * @param height 验证码图片高度
     * @param length 验证码长度（位数）
     * @param expire 验证码过期时间
     * @return com.charon.auth.common.entity.ImageCode
     */
    public static ImageCode createImageCode(Integer width,Integer height,Integer length,Integer expire){
        //生成指定长度的随机数字验证码
        String rands= RandomUtils.randomInt10(length);
        //生成图形验证码
        BufferedImage bufferedImage = ImageCodeUtils.createImageCode(width, height, rands);
        return new ImageCode(bufferedImage,rands,expire);
    }

}
